#!/usr/bin/env python
# encoding: utf-8
# @author: liusir
# @file: check_utils.py
# @time: 2022/11/13 3:15 PM
import json
import re
from utlis.log_utils import logger

class CheckUtils:
    def __init__(self,response_data):
        self.response_data = response_data
        self.check_rules={
            'none':self.__none_check,
            'json_key':self.__key_check,
            'json_key_value':self.__key_value_check,
            'body_regexp':self.__regexp_check,
            'header_key':self.__header_key_check,
            'header_key_value':self.__header_key_value_check,
            'response_code':self.__response_code_check
        }
        self.pass_result={
            'code':0,
            'response_code':self.response_data.status_code,
            'response_reason':self.response_data.reason,
            'response_headers':self.response_data.headers,
            'response_body':self.response_data.text,
            'message':'',
            'check_result':True
        }
        self.fail_result={
            'code': 2,
            'response_code': self.response_data.status_code,
            'response_reason': self.response_data.reason,
            'response_headers': self.response_data.headers,
            'response_body': self.response_data.text,
            'message':'',
            'check_result': False
        }

    def __none_check(self):
        self.pass_result['message'] = '断言类型为none或期望结果未设置，断言成功'
        logger.info( self.pass_result['message'] )
        return self.pass_result
    def __key_check(self,excepted_data):
        excepted_data_key_list = excepted_data.split(',')
        tmp_result = []
        for excepted_data_key in excepted_data_key_list:
            if excepted_data_key in self.response_data.json().keys():
                tmp_result.append(True)
            else:
                tmp_result.append(False)
        if False in tmp_result:
            self.fail_result['message'] = '进行响应正文为json数据时的键比对，期望结果：%s，与实际结果不符合，断言失败'%excepted_data
            logger.error(self.fail_result['message'])
            return self.fail_result
        else:
            self.pass_result['message'] = '进行响应正文为json数据时的键比对，期望结果：%s，与实际结果相符合，断言成功'%excepted_data
            logger.info(self.pass_result['message'])
            return self.pass_result
    def __key_value_check(self,excepted_data):
        excepted_data_key_value_dict = json.loads(excepted_data)
        tmp_result = []
        for excepted_data_key_value in excepted_data_key_value_dict.items():
            if excepted_data_key_value in self.response_data.json().items():
                tmp_result.append(True)
            else:
                tmp_result.append(False)
        if False in tmp_result:
            self.fail_result['message'] = '进行响应正文为json数据时的键值对比对，期望结果：%s，与实际结果不符合，断言失败'%excepted_data
            logger.error(self.fail_result['message'])
            return self.fail_result
        else:
            self.pass_result['message'] = '进行响应正文为json数据时的键值对比对，期望结果：%s，与实际结果相符合，断言成功'%excepted_data
            logger.info(self.pass_result['message'])
            return self.pass_result
    def __regexp_check(self,excepted_data):
        tmp_result = re.findall(excepted_data,self.response_data.text)
        if tmp_result:
            self.pass_result['message'] = '进行响应正文为文本数据时的正则比对，期望结果：%s，与实际结果相符合，断言成功'%excepted_data
            logger.info(self.pass_result['message'])
            return self.pass_result
        else:
            self.fail_result['message'] = '进行响应正文为文本数据时的正则比对，期望结果：%s，与实际结果不符合，断言失败'%excepted_data
            logger.error(self.fail_result['message'])
            return self.fail_result
    def __header_key_check(self,excepted_data):
        excepted_data_key_list = excepted_data.split(',')
        tmp_result = []
        for excepted_data_key in excepted_data_key_list:
            if excepted_data_key in self.response_data.headers.keys():
                tmp_result.append(True)
            else:
                tmp_result.append(False)
        if False in tmp_result:
            return self.fail_result
        else:
            return self.pass_result
    def __header_key_value_check(self,excepted_data):
        excepted_data_key_value_dict = json.loads(excepted_data)
        tmp_result = []
        for excepted_data_key_value in excepted_data_key_value_dict.items():
            if excepted_data_key_value in self.response_data.headers.items():
                tmp_result.append(True)
            else:
                tmp_result.append(False)
        if False in tmp_result:
            return self.fail_result
        else:
            return self.pass_result
    def __response_code_check(self,excepted_data):  # 响应状态码检查
        if self.response_data.status_code == int(excepted_data):
            return self.pass_result
        else:
            return self.fail_result

    def run_check(self,check_rule,excepted_data):
        if check_rule=='none' or excepted_data == '':
            return self.check_rules['none']()
        else:
            return self.check_rules[check_rule](excepted_data)

if __name__=="__main__":
    import requests
    url_parmas = {
        "grant_type": "client_credential",
        "appid": "wx55614004f367f8ca",
        "secret": "65515b46dd758dfdb09420bb7db2c67f"
    }
    response = requests.get(url="https://api.weixin.qq.com/cgi-bin/token",
                            params=url_parmas)
    # v = CheckUtils(response).key_check("access_token")
    # print( v )
    # v = CheckUtils(response).key_value_check('{"expires_in":7200}')
    # print(v)
    v = CheckUtils(response).run_check('response_code','200')
    print( v )

